﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Utilitarios;
using SegIdenPC.Entidad;
using log4net;
using System.Configuration;
using GS1.Utilitario;
using SegIdenPC.Herramientas;

namespace SegIdenPC.Formularios
{
    public partial class frmVentaImprimir : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmVentaImprimir));

        // Formateo Monto
        private const string FORMATO_MONTO = "#0.00";

        private const string ETIQUETA_SUBTOTAL = "SubTotal";
        private const string ETIQUETA_TOTAL = "Total";

        private const string LLAVE_DIRECCIONIMPRESORA = "DIRECCIONIMPRESORA";

        private Venta ventaActual = null;

        private Cliente cliente = null;

        private const string TITULO = "Imprimir Venta";

        private Diseniador diseniadorActual = null;
        #endregion

        #region --- Constructor ---
        public frmVentaImprimir()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---

        private void frmVentaImprimir_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscarVenta();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            if (grabar())
            {
                Libreria.ShowMessageboxInfo("Venta guardado correctamente", TITULO);
            }
            else
            {
                Libreria.ShowMessageboxError("No se guardo los datos", TITULO);
            }
        }

        private void tbtnImprimir_Click(object sender, EventArgs e)
        {
            //this.ventaActual = obtenerDocumentoVenta();

            imprimirDocumento();
        }

        private void btnBuscarDecorador_Click(object sender, EventArgs e)
        {
            elegirDecorador();
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            elegirCliente();
        }
        #endregion

        #region --- Metodos Propios ---
        private T ejecutarOperacionGenerico<T>(Operacion operacion)
        {
            string contenidoXML = string.Empty;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return default(T);
            }

            return contenidoXML.DeserializarTo<T>();
        }

        private void cargarTipoDocumentoVenta()
        {
            ListaTipoDocumentoVenta listaTipoDocumentoVenta = null;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_TIPO_DOCUMENTO_VENTA;

            listaTipoDocumentoVenta = ejecutarOperacionGenerico<ListaTipoDocumentoVenta>(operacion);
            if (listaTipoDocumentoVenta == null) { return; }

            // Estableciendo parametros del combo Tipo doc venta
            this.cboTipoDocVenta.DataSource = listaTipoDocumentoVenta.lista;
            this.cboTipoDocVenta.ValueMember = Constantes.GENERAL_CODIGO;
            this.cboTipoDocVenta.DisplayMember = Constantes.GENERAL_DESCRIPCION;
            this.cboTipoDocVenta.SelectedIndex = 0;
        }

        private void cargarFormulario()
        {
            
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                cargarTipoDocumentoVenta();

                this.txtSerie.Focus();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }
        
        private bool validarEntradaBusqueda()
        {
            this.txtSerie.Text = this.txtSerie.Text.Trim();
            this.txtNumero.Text = this.txtNumero.Text.Trim();

            if (this.txtNumero.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtNumero, "Debes ingresa el número de documento");
                return true;
            }

            if (this.txtSerie.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtSerie, "Debes ingresar la serie del documento");
                return true;
            }
            if (this.ventaActual != null)
            {
                if (!this.ventaActual.serie.Equals(this.txtSerie.Text))
                {
                    Libreria.ShowMessageboxExclamacion("Se está cambiando el número de serie de la Venta", this.ventaActual.serie);
                }

                if (!this.ventaActual.numero.Equals(this.txtNumero.Text))
                {
                    Libreria.ShowMessageboxExclamacion("Se está cambiando el número de la Venta", this.ventaActual.numero);
                }

                if (!this.ventaActual.tipoDocumentoVenta.codigo.Equals(this.cboTipoDocVenta.SelectedValue.ToString()))
                {
                    Libreria.ShowMessageboxExclamacion("Se está cambiando el tipo de documento de Venta", "Venta");
                }
            }

            return false;
        }

        private void buscarVenta()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntradaBusqueda()) { return; }

                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_BUSCAR_VENTA;

                operacion.venta = new Venta();
                operacion.venta.serie =this.txtSerie.Text;
                operacion.venta.numero = this.txtNumero.Text;
                operacion.venta.tipoDocumentoVenta = new TipoDocumentoVenta();
                operacion.venta.tipoDocumentoVenta.codigo = this.cboTipoDocVenta.SelectedValue.ToString();
                    

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                // Obteniendo Objeto de Cliente
                Venta venta = contenidoXML.DeserializarTo<Venta>();

                // Si la venta existe
                if (venta != null)
                {
                    if (venta.estado.Equals(Constantes.ESTADO_VENTA_IMPRESA) || 
                        venta.estado.Equals(Constantes.ESTADO_VENTA_PARCIAL))
                    {
                        Libreria.ShowMessageboxExclamacion("Este documento de venta ya ha sido impreso", this.Text);
                        //return;
                    }

                    if (venta.estado.Equals(Constantes.ESTADO_VENTA_DESPACHADO))
                    {
                        Libreria.ShowMessageboxExclamacion("Este documento de venta ya ha sido despachado", this.Text);
                        //return;
                    }

                    if (venta.estado.Equals(Constantes.ESTADO_VENTA_ANULADO))
                    {
                        Libreria.ShowMessageboxExclamacion("Este documento de venta ya ha sido anulado", this.Text);
                        return;
                    }

                    // Establecer los datos en la pantalla
                    this.ventaActual = venta;
                    this.txtMoneda.Text = ventaActual.moneda.descripcion;
                    this.txtFormaVenta.Text = ventaActual.formaVenta.descripcion;
                    this.txtClienteRazonSocial.Text = ventaActual.cliente.razonSocial;
                    this.txtDecoradorCodigo.Text = ventaActual.diseniador.codDiseniador;
                    this.txtDecoradorDescripcion.Text = ventaActual.diseniador.nombresyApellidos;
                    this.txtNotaCreditoSerie.Text = ventaActual.notaCreditoSerie;
                    this.txtNotaCreditoNumero.Text = ventaActual.notaCreditoNumero;
                    this.txtCodVenta.Text = ventaActual.codVenta;

                    this.txtTotal.Text = ventaActual.total.ToString();


                    if (ventaActual.listaLineaVenta.lista.Count > 9)
                    {
                        Libreria.ShowMessageboxExclamacion("La venta no se podrá imprimir en todo el documento de venta. Se separará el contenido", this.Text);
                        
                        //Se crea la nueva venta donde estarán los registros que sobraron
                        Venta ventaNueva = new Venta();
                        Venta ventaAnterior = new Venta();
                        //Se cargan los datos de la venta
                        ventaNueva.cliente = new Cliente();
                        ventaNueva.cliente = ventaActual.cliente;
                        ventaNueva.codVenta = Constantes.VALOR_CERO;
                        ventaNueva.estado = ventaActual.estado;
                        ventaNueva.fechaRegistro = ventaActual.fechaRegistro;
                        ventaNueva.formaVenta = ventaActual.formaVenta;
                        ventaNueva.moneda = new Moneda();
                        ventaNueva.moneda = ventaActual.moneda;
                        ventaNueva.tienda = new Tienda();
                        ventaNueva.tienda = ventaActual.tienda;
                        ventaNueva.tipoDocumentoVenta = new TipoDocumentoVenta();
                        ventaNueva.tipoDocumentoVenta = ventaActual.tipoDocumentoVenta;
                        ventaNueva.usuario = new Usuario();
                        ventaNueva.usuario = ventaActual.usuario;
                       
                        
                        //Se cargan los datos de la ventaAnterior para facilitar el registro
                        ventaAnterior.cliente = new Cliente();
                        ventaAnterior.cliente = ventaActual.cliente;
                        ventaAnterior.codVenta = ventaActual.codVenta;
                        ventaAnterior.estado = ventaActual.estado;
                        ventaAnterior.fechaRegistro = ventaActual.fechaRegistro;
                        ventaAnterior.formaVenta = ventaActual.formaVenta;
                        ventaAnterior.moneda = new Moneda();
                        ventaAnterior.moneda = ventaActual.moneda;
                        ventaAnterior.tienda = new Tienda();
                        ventaAnterior.tienda = ventaActual.tienda;
                        ventaAnterior.tipoDocumentoVenta = new TipoDocumentoVenta();
                        ventaAnterior.tipoDocumentoVenta = ventaActual.tipoDocumentoVenta;
                        ventaAnterior.usuario = new Usuario();
                        ventaAnterior.usuario = ventaActual.usuario;
                        ventaAnterior.numero = ventaActual.numero;
                        ventaAnterior.serie = ventaActual.serie;

                        //Se crea la lista de las lineas que sobraron
                        ListaLineaVenta listaLineaVentaNueva = new ListaLineaVenta();
                        ListaLineaVenta listaLineaVentaAnterior = new ListaLineaVenta();
                        //Se debe cortar la lista no debe esperar a mandar a imprimir 
                        int iContador = 0;
                        double dAcumVentaAnterior = 0;
                        double dAcumVentaNuevo = 0;
                        foreach (LineaVenta lineaVentaActual in ventaActual.listaLineaVenta.lista)
                        {
                            if (iContador < 8)
                            {
                                LineaVenta lineaVentaAnterior = new LineaVenta();
                                lineaVentaAnterior.cantidad = lineaVentaActual.cantidad;
                                lineaVentaAnterior.codVenta = lineaVentaActual.codVenta;
                                lineaVentaAnterior.numeroLinea = (iContador - 8).ToString();
                                lineaVentaAnterior.precio = lineaVentaActual.precio;
                                lineaVentaAnterior.producto = new Producto();
                                lineaVentaAnterior.producto = lineaVentaActual.producto;
                                lineaVentaAnterior.listaLineaVentaItem = new ListaLineaVentaItem();
                                lineaVentaAnterior.listaLineaVentaItem = lineaVentaActual.listaLineaVentaItem;
                                listaLineaVentaAnterior.add(lineaVentaAnterior);
                                dAcumVentaAnterior = lineaVentaActual.precio + dAcumVentaAnterior;
                            }
                            else
                            {
                                LineaVenta lineaVentaNuevo = new LineaVenta();
                                lineaVentaNuevo.cantidad = lineaVentaActual.cantidad;
                                lineaVentaNuevo.codVenta = Constantes.VALOR_CERO;
                                lineaVentaNuevo.numeroLinea = (iContador - 8).ToString();
                                lineaVentaNuevo.precio = lineaVentaActual.precio;
                                dAcumVentaNuevo = lineaVentaActual.precio + dAcumVentaNuevo;
                                lineaVentaNuevo.producto = new Producto();
                                lineaVentaNuevo.producto = lineaVentaActual.producto;
                                lineaVentaNuevo.listaLineaVentaItem = new ListaLineaVentaItem();
                                lineaVentaNuevo.listaLineaVentaItem = lineaVentaActual.listaLineaVentaItem;
                                listaLineaVentaNueva.add(lineaVentaNuevo);
                            }
                            iContador++;
                        }
                        //Se registra la lista hasta los 8 primeras lineas
                        ventaAnterior.listaLineaVenta = new ListaLineaVenta();
                        ventaAnterior.listaLineaVenta = listaLineaVentaAnterior;
                        //Se registra el resto de las lineas
                        ventaNueva.listaLineaVenta = new ListaLineaVenta();
                        ventaNueva.listaLineaVenta = listaLineaVentaNueva;
                        
                        // Se debe llamar a una ventana para registrar el nuevo número de la venta y jalar los datos de la Lista linea Venta con sus Items
                        using (frmDocSerieNumeroAgregar frmDocSerieNumeroAgregar = new frmDocSerieNumeroAgregar())
                        {
                            frmDocSerieNumeroAgregar.venta = ventaNueva;

                            if (frmDocSerieNumeroAgregar.ShowDialog() == DialogResult.Cancel) { frmDocSerieNumeroAgregar.Dispose(); return; }

                            ventaNueva.serie = frmDocSerieNumeroAgregar.venta.serie;
                            ventaNueva.numero = frmDocSerieNumeroAgregar.venta.numero;

                            frmDocSerieNumeroAgregar.Dispose();
                        }
                                              
                        //Se calcula nuevamente los valores de Venta y del IGV en cada uno de los casos
                        //para venta Anterior
                        //-----------------------------------------------------------------------
                        //El Precio ya incluye el IGV, en el momento que se decida si el cliente quiere factura o boleta se define el calculo.
                        //-----------------------------------------------------------------------
                        // Calculando el total a pagar
                        ventaAnterior.total = Math.Round(dAcumVentaAnterior, 2);

                        //obteniendo el monto total
                        ventaAnterior.subTotal = Math.Round((ventaAnterior.total) / (1 + cargarIgv()), 2);

                        //calculando el IGV 
                        ventaAnterior.igv = Math.Round(ventaAnterior.total - ventaAnterior.subTotal, 2);
                        //-----------------------------------------------------------------------
                        //para venta Nueva
                        //-----------------------------------------------------------------------
                        //El Precio ya incluye el IGV, en el momento que se decida si el cliente quiere factura o boleta se define el calculo.
                        //-----------------------------------------------------------------------
                        // Calculando el total a pagar
                        ventaNueva.total = Math.Round(dAcumVentaNuevo, 2);

                        //obteniendo el monto total
                        ventaNueva.subTotal = Math.Round((ventaNueva.total) / (1 + cargarIgv()), 2);

                        //calculando el IGV 
                        ventaNueva.igv = Math.Round(ventaNueva.total - ventaNueva.subTotal, 2);
                        //-----------------------------------------------------------------------
                        //Se graba la nueva venta y se actualiza la venta anterior
                        separarVenta(ventaAnterior, ventaNueva);

                        //Se actualiza los datos que se van a imprimir y mostrar
                        this.txtTotal.Text = ventaAnterior.total.ToString();
                        ventaActual.total = ventaAnterior.total;
                        ventaActual.subTotal = ventaAnterior.subTotal;
                        ventaActual.igv = ventaAnterior.igv;
                        ventaActual.listaLineaVenta = new ListaLineaVenta();
                        ventaActual.listaLineaVenta = ventaAnterior.listaLineaVenta;
                    }

                    // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                    this.dgvListadoItemsSeleccionados.AutoGenerateColumns = false;

                    this.dgvListadoItemsSeleccionados.DataSource = ventaActual.listaLineaVenta.lista == null ?
                                                           new ListPersonalizada<LineaVenta>() :
                                                           ventaActual.listaLineaVenta.lista;

                    pintarGrilla(this.dgvListadoItemsSeleccionados);
                }
                else
                {
                    Libreria.ShowMessageboxExclamacion("El registro de la venta buscada no existe", this.Text);
                    return;
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private Double cargarIgv()
        {
            Double igv = 0;
            Operacion operacion = null;
            ListaParametro listaParametro = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_PARAMETROS;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return 0;
            }

            // Obteniendo Objeto de Nivel
            listaParametro = contenidoXML.DeserializarTo<ListaParametro>();

            foreach (Parametro parametro in listaParametro.lista)
            {
                switch (parametro.codigo)
                {
                    case Constantes.CODIGO_PARAMETRO_IGV:
                        igv = parametro.valor.ToDouble();
                        break;
                }
            }
            return igv;
        }

        private Boolean grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntradaBusqueda()) { return false; }

                // Solicitar confirmacion
                if (!Libreria.ShowMessageboxPregunta("¿Estas seguro de actualizar la Venta?", TITULO)) { return false; }

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_MODIFICAR_VENTA;

                operacion.venta = ventaActual;

                // Estableciendo estado y fecha
                operacion.venta.estado = Constantes.ESTADO_VENTA_PENDIENTE;

                operacion.venta.diseniador = new Diseniador();
                operacion.venta.diseniador = this.diseniadorActual;

                operacion.venta.notaCreditoNumero = this.txtNotaCreditoNumero.Text;
                operacion.venta.notaCreditoSerie = this.txtNotaCreditoSerie.Text;

                if (this.cliente != null && operacion.venta.tipoDocumentoVenta.codigo.Equals(Constantes.CODIGO_TIPO_VENTA_BOLETA))
                {
                    operacion.venta.cliente = this.cliente;
                }

                operacion.venta.serie = this.txtSerie.Text;
                operacion.venta.numero = this.txtNumero.Text;
                operacion.venta.tipoDocumentoVenta.codigo = this.cboTipoDocVenta.SelectedValue.ToString();

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return false;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    
                    return true;
                }
                else
                {
                    return false;
                }
           
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
                return false;
            }
        }

        private void separarVenta(Venta ventaAnterior, Venta ventaNueva)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_ACTUALIZAR_VENTA;

                //Cargando los datos de las ventas
                operacion.ventaActual = ventaAnterior;
                operacion.ventaNueva = ventaNueva;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    //this.txtCodigo.Text = operacionResultado.codigoGenerado;
                    Libreria.ShowMessageboxInfo("Venta guardado correctamente", TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se guardo los datos", TITULO);
                    return;
                }


            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void pintarGrilla(DataGridView grilla)
        {
            ListPersonalizada<LineaVenta> listaLineaVenta = null;
            listaLineaVenta = (ListPersonalizada<LineaVenta>)grilla.DataSource;

            if (listaLineaVenta != null)
            {
                for (int i = 0; i < listaLineaVenta.Count; i++)
                {
                    LineaVenta lineaVenta = listaLineaVenta[i];
                    grilla.Rows[i].Cells[1].Value = lineaVenta.producto.codigo;
                    grilla.Rows[i].Cells[2].Value = lineaVenta.producto.codProductoProveedor;
                    grilla.Rows[i].Cells[4].Value = lineaVenta.producto.nivelProducto.descripcion + " " +
                        lineaVenta.producto.nivelTipo.descripcion + " " +
                        lineaVenta.producto.nivelMaterial.descripcion + " " +
                        lineaVenta.producto.nivelColor.descripcion;
                }
            }
        }

        private void elegirCliente()
        {
            using (frmMantCliente frmMantCliente = new frmMantCliente())
            {
                frmMantCliente.formularioBusqueda = true;
                if (frmMantCliente.ShowDialog() == DialogResult.Cancel) { return; }

                this.cliente = frmMantCliente.clienteActual;
                this.txtClienteRazonSocial.Text = this.cliente.razonSocial;
            }

        }

        private void imprimirDocumento()
        {
            Boolean reimprimir = false;

            if (grabar())
            {
                ImprimirDocumentoVenta imprimirDocumento = null;
                Facturacion factura = new Facturacion();
                imprimirDocumento = new ImprimirDocumentoVenta(this.ventaActual, factura);
                imprimirDocumento.establecerImpresora(ConfigurationManager.AppSettings[LLAVE_DIRECCIONIMPRESORA]);
                
                if (this.cboTipoDocVenta.SelectedValue.ToString().Equals(Constantes.CODIGO_TIPO_VENTA_FACTURA))
                {
                    switch (this.txtSerie.Text)
                    {
                        case Constantes.SERIE_CHACARILLA:
                            if (this.chkConsolidado.Checked == false) imprimirDocumento.ejecutarFactura004();
                            //else imprimirDocumento.ejecutarFacturaConsolidado004();
                            break;
                        case Constantes.SERIE_SANISIDRO:
                            if (this.chkConsolidado.Checked == false) imprimirDocumento.ejecutarFactura0001();
                            //else imprimirDocumento.ejecutarFacturaConsolidado0001();
                            break;
                        default:
                            break;
                    }
                }
                else if (this.cboTipoDocVenta.SelectedValue.ToString().Equals(Constantes.CODIGO_TIPO_VENTA_BOLETA))
                {
                    switch (this.txtSerie.Text)
                    {
                        case Constantes.SERIE_CHACARILLA:
                            imprimirDocumento.ejecutarBoleta004();
                            break;
                        case Constantes.SERIE_SANISIDRO:
                            imprimirDocumento.ejecutarBoleta0001();
                            break;
                        default:
                            break;
                    }
                }

                Libreria.ShowMessageboxInfo("Finalizó proceso de impresión", TITULO);

                if (!reimprimir)
                {
                    if (this.cboEntregaDirecta.Checked == true)
                    {
                        creaGuiaElectronica();
                    }
                }
            }
        }

        private void creaGuiaElectronica()
        {
            //Crea Guia Electronica Nueva
            Guia guiaElectronica = new Guia();

            //Temporalmente le asigna un código 0 que en Java se actualiza
            guiaElectronica.codGuia = Constantes.VALOR_CERO;
            //Se considera que el bien vendido ha sido DESPACHADO
            guiaElectronica.estado = Constantes.ESTADO_DOCUMENTO_DESPACHADO;
            //Se toma la fecha y hora de manera temporal como fecha de emisión
            guiaElectronica.fechaEmision = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
            //Se toma la fecha y hora de manera temporal como fecha de registro
            guiaElectronica.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
            //Se indica el tipo de guia
            guiaElectronica.tipoGuia = new TipoGuia();
            guiaElectronica.tipoGuia.codigo = Constantes.CODIGO_TIPO_GUIA_ELECTRONICA;
            guiaElectronica.tipoGuia.descripcion = Constantes.DESCRIPCION_TIPO_GUIA_ELECTRONICA;
            //Se cambia el estado de la venta
            this.ventaActual.estado = Constantes.ESTADO_VENTA_DESPACHADO;
            //Se le asigna la venta actual
            guiaElectronica.venta = this.ventaActual;
            //Se crean las lineas de la guia
            guiaElectronica.listaLineaGuia = new ListaLineaGuia();
            //la variable iNumeroLinea es una numeración de linea temporal
            int iNumeroLinea =1;

            //se abre el contenido de la Venta, por que se cargaran todas las lineas en la guia
            foreach (LineaVenta lineaVenta in this.ventaActual.listaLineaVenta.lista)
            {
                //Se crea la linea de Guia
                LineaGuia lineaGuiaNueva = new LineaGuia();
                //Se asigna un codigo en Valor 0 para faciltar la identifiación de la guia
                lineaGuiaNueva.codGuia = Constantes.VALOR_CERO;
                //Se coloca la cantidad que se grabó en la venta
                lineaGuiaNueva.cantidad = lineaVenta.cantidad;
                //Se asigna el producto que esta en la venta
                lineaGuiaNueva.producto = lineaVenta.producto;
                //Se coloca el valor de la linea de la guia
                lineaGuiaNueva.numeroLinea = iNumeroLinea.ToString();
                //Se crea la lista para incluir los items que se van a trasladar
                lineaGuiaNueva.listaLineaGuiaItem = new ListaLineaGuiaItem();

                foreach(LineaVentaItem lineaVentaItem in lineaVenta.listaLineaVentaItem.lista)
                {
                    //Se crea la linea de Item
                    LineaGuiaItem lineaGuiaItem = new LineaGuiaItem();
                    //Se asigna el Item
                    lineaGuiaItem.item = lineaVentaItem.item;
                    //Se coloca el numero de la linea
                    lineaGuiaItem.nroLinea = lineaGuiaNueva.numeroLinea;
                    //Se adopta el número temporal de la guia
                    lineaGuiaItem.codGuia = Constantes.VALOR_CERO;
                    //Se carga el item en la linea de la guia Item
                    lineaGuiaNueva.listaLineaGuiaItem.add(lineaGuiaItem);
                }
                //Se carga la lineaGuia en el sistema
                guiaElectronica.listaLineaGuia.add(lineaGuiaNueva);
                //Se suma una linea nueva
                iNumeroLinea++;
            }

            //La guia esta llena

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_REGISTRAR_GUIA_DOCUMENTO;

                operacion.guia = guiaElectronica;
                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxInfo(operacionError.descripcion, TITULO);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Libreria.ShowMessageboxError("Se generó el registro de la salida correctamente", TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se creo el registro de la salida", TITULO);
                    return;
                }

                
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void elegirDecorador()
        {
            using (frmMantDecorador frmMantDecorador = new frmMantDecorador())
            {
                frmMantDecorador.formularioBusqueda = true;
                if (frmMantDecorador.ShowDialog() == DialogResult.Cancel) { return; }

                this.diseniadorActual = frmMantDecorador.diseniadorActual;
                this.txtDecoradorCodigo.Text = this.diseniadorActual.codDiseniador;
                this.txtDecoradorDescripcion.Text = this.diseniadorActual.nombresyApellidos;
            }
        }

        private void salir()
        {
            this.Close();
        }
        #endregion
    }
}
